package zww.study.objcet;

import java.sql.Date;

public class StaticStudy {

    /*
     * static是java中的修饰符：修饰成员变量或者方法
     * 静态成员变量虽然独立于对象，但是不代表不可以通过对象去访问，所有的静态方法和静态变量都可以通过对象访问（只要访问权限足够）
     * 　作用： 方便在没有创建对象的情况下来进行调用（方法/变量）。
     *         随着类的加载而加载，优先于对象存在
     *         可以通过类名调用也可以通过对象名调用 类名.方法名/变量名 也可以实例化对象 对象.方法/变量
     * 静态方法只能访问静态的成员 非静态方法可以访问静态的成员，也可以访问非静态的成员 静态方法中是没有this关键字
     *
     * static 代码块
     *   　static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方，
     * 类中可以有多个static块。在类初次被加载的时候，
     * 会按照static块的顺序来执行每个static块，并且只会执行一次。
     *
     * ava中的static与C/C++中的static关键字的功能混淆了。在这里只需要记住一点：与C/C++中的static不同，
     * Java中的static关键字不会影响到变量或者方法的作用域。
     * 在Java中能够影响到访问权限的只有private、public、protected（包括包访问权限）这几个关键字。
     *
     *  */

    private Date birthDate;
    private static Date startDate, endDate;

    static {
        startDate = Date.valueOf("1946");
        endDate = Date.valueOf("1964");
    }

    public void Person(Date birthDate) {
        this.birthDate = birthDate;
    }

    public boolean isBornBoomer() {
        return birthDate.compareTo(startDate) >= 0 && birthDate.compareTo(endDate) < 0;
    }
/*
* 每次isBornBoomer被调用的时候，都会生成startDate和birthDate两个对象，造成了空间浪费
* 将一些只需要进行一次的初始化操作都放在static代码块中进行，static代码块只会执行一次
* */
    public boolean isBornBoomerCompare() {
        Date startDate = Date.valueOf("1946");
        Date endDate = Date.valueOf("1964");
        return birthDate.compareTo(startDate) >= 0 && birthDate.compareTo(endDate) < 0;
    }

}
